#ifndef __LLIGADA
#define __LLIGADA
/**
 * Módulo para trabalhar com listas ligadas
 *
 */

typedef struct	lligada_nodo * LLIGADA;
/**
 * @fn lligada_inserir
 * @brief Funcao que insere numa lista ligada
 * @param lista É a lista a inserir
 * @param info informacao a inserir na lista
 */
int			lligada_inserir		(LLIGADA *lista, void * info);

/**
 * @fn lligada_pesquisar
 * @brief Função de pesquisa numa lista ligada
 * @param lista lista a procurar a informação
 * @param chave apontador para
 * @param funcao_comparacao funcao que verifica se uma chave corresponde a uma informação, retorna 1 em verdadeiro
 */

void *			lligada_pesquisar	(LLIGADA  lista, void *chave, int (*funcao_comparacao)(void *,void *));

/**
 * @fn lligada_remover
 * @brief Funcao que remove um elemento da lista ligada
 * @param lista lista ligada para eliminar o elemento
 * @param chave chave da informação para remover
 * @param funcao_comparacao funcao que verifica se uma chave corresponde a uma informação, retorna 1 em verdadeiro
 */

int 			lligada_remover 	(LLIGADA *lista, void *chave, int (*funcao_comparacao)(void *,void *));
/**
 * @fn lligada_para_arr
 * @brief Funcao que recebe uma lista ligada e cria um array com os seus componentes
 * @param lista Lista ligada que se pretende criar um array
 * @param int Tamanho do array a ser criada com os componentes da lista ligada
 */

void *			lligada_para_arr	(LLIGADA  lista, int *);

/**
 * @fn lligada_tamanho
 * @brief Funcao que devolte o tamanho de uma lista
 * @param lista Lista ligada que se pretende calcular o tamanho
 * @param tamanho Váriavel que é incrementada para calcular o tamanho da lista
 */
int 			lligada_tamanho		(LLIGADA  lista, int *);

/**
 * @fn lligada_map
 * @brief Funcao que aplica uma dada funcao a todos os elementos da lista //map em Haskell
 * @param lista Lista a aplicar a funcao em todos os elementos
 * @param f Função a aplicar, deve retornar 0 em sucesso, e 1 noutros casos
 */

int 			lligada_map		(LLIGADA  lista, int (*f)(void *, void *), void *);

#endif